package org.zjx.core;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.zjx.entity.Location;
import org.zjx.model.route.Route;

import java.util.*;

/**
 * 路由图数据结构
 * 使用邻接表实现，支持高效路径查询
 */
@Data
@NoArgsConstructor
public class RouteGraph {
    private final Map<Location, List<Route>> adjacencyMap = new HashMap<>();
    private final Set<Location> allLocations = new HashSet<>();

    /**
     * 添加路由（自动处理位置信息）
     * @param route 路由对象（非null）
     * @throws IllegalArgumentException 如果路由为null
     */
    public void addRoute(Route route) {
        Objects.requireNonNull(route, "路由不能为null");
        adjacencyMap.computeIfAbsent(route.getStart(), k -> new ArrayList<>())
                .add(route);
        allLocations.add(route.getStart());
        allLocations.add(route.getEnd());
    }

    /**
     * 批量添加路由
     * @param routes 路由集合（非null）
     */
    public void addAllRoutes(Collection<Route> routes) {
        routes.forEach(this::addRoute);
    }

    /**
     * 获取从指定位置出发的所有路由
     * @param location 起始位置（非null）
     * @return 不可修改的路由列表（不会返回null）
     */
    public List<Route> getRoutesFrom(Location location) {
        return Collections.unmodifiableList(
                adjacencyMap.getOrDefault(location, Collections.emptyList()));
    }

    /**
     * 获取图中所有位置
     * @return 不可修改的位置集合
     */
    public Set<Location> getAllLocations() {
        return Collections.unmodifiableSet(allLocations);
    }

    /**
     * 检查是否包含指定位置
     * @param location 查询位置
     * @return 如果包含返回true
     */
    public boolean containsLocation(Location location) {
        return allLocations.contains(location);
    }

    /**
     * 复制构造函数（深拷贝）
     */
    public RouteGraph(RouteGraph other) {
        other.adjacencyMap.forEach((loc, routes) ->
                this.adjacencyMap.put(loc, new ArrayList<>(routes)));
        this.allLocations.addAll(other.allLocations);
    }
}